/* Definicao das estruturas da Tabela de Simbolos e das funcoes para manipulacao
   da Tabela de Simbolos.
 */

#define TAMPILHA 100


/* Estruturas da Tabela de Simbolos */
enum categoria{ categ_vs=1001, categ_pf, categ_proc, categ_func, categ_label };
enum passagem_param { por_valor=2001, por_refer };


typedef struct param_formais {
	enum passagem_param passagem_parametros;
}TParamFormais;

typedef struct procedimentos {
	char rot_interno[4];  // rotulo interno
	int numPF;  // numero de parametros formais
	int *parametros;  // ponteiro p/ vetor com o tipo de passagem p/ cada parametro formal
	int numVarsLocal;
}TProcedimento;


typedef struct labels {
	char rot_interno[4];  // rotulo interno
	char rot_pai[4]; // o rotulo Pai onde rotulo foi declarado.
}TLabel;

/* Definicao dos Elementos da Tabela de Simbolos  */
typedef struct elemento_TS {
	char ident[16];
	enum categoria categ;
	int nivel; // nivel lexico
	char ender_lexico[6];
	char tipo[8];
	
	union u_categ {
		TParamFormais pf;		
		TProcedimento proc;
		TProcedimento func;
		TLabel lab;
	}u_categ;	
}ElemTS;

/* Definicao da Tabela de Simbolos  */
typedef struct tab_simb {
	int topo;
	ElemTS elem[TAMPILHA];
}TabelaSimbolos;


/* Definicao das funcoes para manipular a da Tabela de Simbolos  */
void fazPilhaVazia( TabelaSimbolos* tab_simbolos );

int vazia( TabelaSimbolos* tab_simbolos );

void empilha( ElemTS elem_TS, TabelaSimbolos* tab_simbolos );

ElemTS desempilha( TabelaSimbolos* tab_simbolos);

void desempilha_elementos( int qtd, TabelaSimbolos* tab_simbolos );

int busca_elemento_nivel( char *id, int nivel, TabelaSimbolos* tab_simbolos );

int busca_elemento( char *id, TabelaSimbolos* tab_simbolos );

int busca_numero_varslocal_ao_rotulo( char* rotulo, TabelaSimbolos* tab_simbolos );

int busca_numero_varslocal_no_nivel( int nivel, TabelaSimbolos* tab_simbolos );

void imprime_tabela_de_simbolos( TabelaSimbolos* tab_simbolos );

int busca_elemento_qualquer_nivel( char *id, int nivel, TabelaSimbolos* tab_simbolos );

void imprime_indice_params( int i, TabelaSimbolos* tab_simbolos );

void desempilha_elementos_nivel_acima( int nivel, TabelaSimbolos* tab_simbolos);

void desempilha_elementos_coletor( int num, int nivel, TabelaSimbolos* tab_simbolos);
